package _19_顺时针打印矩阵;
/**
 * 题目描述
 * 输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字，
 * 例如，如果输入如下4 X 4矩阵：
 * 1  2  3  4
 * 5  6  7  8
 * 9  10 11 12
 * 13 14 15 16
 * 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
 * <p>
 * 思路：
 * 先打印 0,0 —— 0，n-2
 * 然后打印 0，n-1 —— n-2  , n-1
 * n-1,n-1 —— n-1, 1
 * n-1,0 —— 1,0
 * <p>
 * 思路：
 * 先打印 0,0 —— 0，n-2
 * 然后打印 0，n-1 —— n-2  , n-1
 * n-1,n-1 —— n-1, 1
 * n-1,0 —— 1,0
 * <p>
 * 思路：
 * 先打印 0,0 —— 0，n-2
 * 然后打印 0，n-1 —— n-2  , n-1
 * n-1,n-1 —— n-1, 1
 * n-1,0 —— 1,0
 * <p>
 * 思路：
 * 先打印 0,0 —— 0，n-2
 * 然后打印 0，n-1 —— n-2  , n-1
 * n-1,n-1 —— n-1, 1
 * n-1,0 —— 1,0
 */
/**
 * 思路：
 *      先打印 0,0 —— 0，n-2
 *      然后打印 0，n-1 —— n-2  , n-1
 *             n-1,n-1 —— n-1, 1
 *             n-1,0 —— 1,0
 */

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public ArrayList<Integer> printMatrix(int[][] matrix) {
        ArrayList<Integer> list = new ArrayList<>();
        int rows = matrix.length;
        int cols = matrix[0].length;
        int x = 0, y = 0;
        while (rows > 0 && cols > 0) {
            if (rows == 1) {
                for (int i = 0; i < cols; i++) {
                    list.add(matrix[x][y++]);
                }
                break;
            } else if (cols == 1) {
                for (int i = 0; i < rows; i++) {
                    list.add(matrix[x++][y]);
                }
                break;
            }
            for (int i = 0; i < cols - 1; i++) {
                list.add(matrix[x][y++]);
            }
            for (int i = 0; i < rows - 1; i++) {
                list.add(matrix[x++][y]);
            }
            for (int i = 0; i < cols - 1; i++) {
                list.add(matrix[x][y--]);
            }
            for (int i = 0; i < rows - 1; i++) {
                list.add(matrix[x--][y]);
            }
            x++;
            y++;
            rows -= 2;
            cols -= 2;
        }
        return list;
    }

    public ArrayList<Integer> printMatrix2(int[][] matrix) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        int rows = matrix.length;
        int cols = matrix[0].length;
        int x = 0, y = 0;
        while (rows > 1 && cols > 1) {
            for(int i=0;i<cols-1;i++){
                arrayList.add(matrix[x][y++]);
            }
            for(int i=0;i<rows-1;i++){
                arrayList.add(matrix[x++][y]);
            }
            for(int i=0;i<cols-1;i++){
                arrayList.add(matrix[x][y--]);
            }
            for(int i=0;i<rows-1;i++){
                arrayList.add(matrix[x--][y]);
            }
            x++;y++;
            rows-=2;
            cols-=2;
        }
        if(rows==1){
            for(int i=0;i<cols;i++){
                arrayList.add(matrix[x][y++]);
            }
        }else if(cols==1){
            for(int i=0;i<rows;i++){
                arrayList.add(matrix[x++][y]);
            }
        }
        return arrayList;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int a[][] = {
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,16}
        };
        List<Integer> list = solution.printMatrix2(a);
        System.out.println(list);
    }
}